#include <stdio.h>
#include <unistd.h>
#include <aio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#define BUFFSIZE 1024
#define AIO_LIST_NUM 2

int main()
{
    //准备好缓冲区
    struct aiocb cb = {0};
    struct aiocb cb1 = {0};
    //异步读
    int fd = open("1.txt",O_RDONLY);
    if (-1==fd)
    {
        printf("打开文件失败:%m\n");
        exit(-1);
    }
    printf("打开文件成功\n");


    int fd1 = open("2.txt",O_RDONLY);
    if (-1==fd1)
    {
        printf("打开文件失败:%m\n");
        exit(-1);
    }
    printf("打开文件成功\n");



    cb.aio_fildes = fd;
    cb.aio_offset=0;//偏移量
    cb.aio_buf = malloc(BUFFSIZE);
    memset(cb.aio_buf,0,BUFFSIZE);
    cb.aio_nbytes = BUFFSIZE-1;
    // cb.aio_reqprio = 0;


    cb1.aio_fildes = fd1;
    cb1.aio_offset=0;//偏移量
    cb1.aio_buf = malloc(BUFFSIZE);
    memset(cb1.aio_buf,0,BUFFSIZE);
    cb1.aio_nbytes = BUFFSIZE-1;


    int r = aio_read(&cb);
    if (-1==r)
    {
        printf("异步读失败:%m\n");
        exit(-1);
    }
    printf("异步读成功\n");

     r = aio_read(&cb1);
    if (-1==r)
    {
        printf("异步读失败:%m\n");
        exit(-1);
    }
    printf("异步读成功\n");


    //检查是否操作完毕
    struct aiocb* aiocb_list[AIO_LIST_NUM];
    aiocb_list[0] = &cb;
    aiocb_list[0] = &cb1;
    r   = aio_suspend(aiocb_list,AIO_LIST_NUM,NULL); //有一个就返回
    if (-1==r)
    {
        printf("aio_suspend失败:%m\n");
        exit(-1);
    }
    printf("aio_suspend结束\n");


    sleep(3);

    //得到数据

    r = aio_return(&cb);
    if (r >0)
    {
        printf("读到了%d字节数据:%s\n",r,cb.aio_buf);
    }

     r = aio_return(&cb1);
    if (r >0)
    {
        printf("读到了%d字节数据:%s\n",r,cb1.aio_buf);
    }
    //收尾
    free(cb.aio_buf);
    free(cb1.aio_buf);
    close(fd);
    close(fd1);

    return 0;
}